package com.skyline.wo.service;

import java.util.List;

import net.imagine.provider.skyline.ImageResizeResult;

import com.skyline.common.bean.Page;
import com.skyline.user.model.User;
import com.skyline.wo.model.Album;
import com.skyline.wo.model.Photo;

/**
 * 相册模块Service
 * 
 * @author wuqh
 * */
public interface AlbumService {
	/**
	 * 创建相册
	 * 
	 * @param user
	 *            相册拥有者
	 * @param album
	 *            相册信息，必须包含 albumName:相册名;place:地点;description:描述;authority:权限
	 * @return 创建的相册
	 */
	public Album createAlbum(User owner, Album album);

	/**
	 * 删除相册（置状态为删除，如果可以被删除）
	 * 
	 * @param albumId
	 *            相册Id
	 * @param userId
	 *            用户Id
	 */
	public void deleteAlbum(long albumId, long userId);

	/**
	 * 获取用户相册信息（不包含地址、描述）
	 * 
	 * @param albumId
	 *            相册Id
	 * @return 相册信息
	 */
	public Album getAlbumById(long albumId);

	/**
	 * 获取用户相册详细信息，用于修改页面的现实
	 * 
	 * @param albumId
	 *            相册Id
	 * @param userId
	 *            用户Id
	 * @return 相册信息
	 */
	public Album getAlbumForChange(long albumId, long userId);

	/**
	 * 浏览用户所有相册列表（分页），浏览者和被浏览者不能同时为0，如果被浏览者Id=0，就认为是看自己的相册列表。
	 * 
	 * @param ownerId
	 *            拥有者Id
	 * @param viewerId
	 *            浏览者Id
	 * @param authority
	 *            浏览者相对于拥有者的权限
	 * @param page
	 *            分页用（传null时不分页，全部查询）
	 * @return 相册列表（不含相册地点、描述）
	 */
	public List<Album> listAlbumsWithPortraitAlbum(long ownerId, long viewerId, int authority, Page page);

	/**
	 * 浏览用户所有相册列表（分页），浏览者和被浏览者不能同时为0，如果被浏览者Id=0，就认为是看自己的相册列表。
	 * 
	 * @param ownerId
	 *            拥有者Id
	 * @param viewerId
	 *            浏览者Id
	 * @param authority
	 *            浏览者相对于拥有者的权限
	 * @param page
	 *            分页用（传null时不分页，全部查询）
	 * @return 相册列表（不含相册地点、描述）
	 */
	public List<Album> listAlbumsWithoutPortraitAlbum(long ownerId, long viewerId, int authority, Page page);

	/**
	 * 修改相册信息（只修改相册名、地点、描述、权限）
	 * 
	 * @param newAlbum
	 *            新的相册信息，必须包含ownerId:用户Id;id:相册Id;albumName:相册名;place:地点;
	 *            description :描述;authority:权限
	 */
	public void editAlbum(Album newAlbum);

	/**
	 * 浏览相册（分页），albumId不能为0，如果需要增加访问量，且访问者的id和相册主人Id不一致，增加相册访问量
	 * 
	 * @param albumId
	 *            相册Id
	 * @param viewerId
	 *            浏览者Id
	 * @param authority
	 *            浏览者相对于拥有者的权限
	 * @param page
	 *            分页用（传null时不分页，全部查询）
	 * @param addVisit
	 *            是否增加该相册访问量
	 * @return 照片列表
	 */
	public List<Photo> listPhotosOfAlbum(long albumId, long viewerId, int authority, Page page, boolean addVisit);

	/**
	 * 
	 * */
	public List<Photo> createPhotos(User owner, Album album, List<? extends ImageResizeResult> filesInfo);

	/**
	 * 获取图片的详细信息
	 * 
	 * @param photoId
	 *            图片Id
	 * @param viewerId
	 *            访问者Id
	 * @param addVisit
	 *            是否增加该相册访问量
	 * @return 照片
	 * */
	public Photo getPhotoDetailById(long photoId, long viewerId, boolean addVisit);

	/**
	 * 上传成功后修改图片的描述信息
	 * 
	 * @param albumId
	 *            相册Id
	 * @param ids
	 *            待修改的图片Id
	 * @param descriptions
	 *            图片的描述
	 * */
	public void changePhotosDescription(long albumId, List<Long> ids, List<String> descriptions);

	/**
	 * 修改图片的描述信息
	 * 
	 * @param albumId
	 *            相册Id
	 * @param id
	 *            待修改的图片Id
	 * @param description
	 *            图片的描述
	 * */
	public void changePhotoDescription(long albumId, long id, String description);

	/**
	 * 修改图片的所属相册
	 * 
	 * @param ownerId
	 *            拥有者Id
	 * @param photoId
	 *            待修改的图片Id
	 * @param fromAlbumId
	 *            相册Id
	 * @param toAlbumId
	 *            相册Id
	 * */
	public void changePhotoAlbum(long ownerId, long photoId, long fromAlbumId, long toAlbumId);

	/**
	 * 修改相册封面
	 * 
	 * @param ownerId
	 *            拥有者Id
	 * @param albumId
	 *            需要修改相册的Id
	 * @param cover
	 *            封面路径
	 * @param coverExt
	 *            封面图片格式
	 * */
	public void changeAlbumCover(long ownerId, long albumId, String cover, String coverExt);

	/**
	 * 删除图片
	 * 
	 * @param userId
	 *            用户Id
	 * @param photoId
	 *            待删除图片Id
	 * @return 相册Id
	 * */
	public Long deletePhoto(long userId, long photoId);

	/**
	 * 获取用户图片详细信息，用于修改页面的现实
	 * 
	 * @param userId
	 *            用户Id
	 * @param photoId
	 *            图片Id
	 * @return 图片信息
	 */
	public Photo getPhotoForChange(long userId, long photoId);

	/**
	 * 获取用户所有相册的相册名（不包含头像相册）
	 * 
	 * @param userId
	 *            用户Id
	 * @return 相册名列表
	 * */
	public List<Album> listAlbumNames(long userId);

	/**
	 * 获取相册中所有图片的文件列表
	 * 
	 * @param albumId
	 *            相册Id
	 * @param authority
	 *            查看者的权限
	 * */
	public List<Photo> listPhotoFilesOfAlbum(long albumId, int authority);

	/**
	 * 获取用户的头像相册
	 * 
	 * @param ownerId
	 *            用户Id
	 * @return 用户的头像相册信息
	 * */
	public Album getUserPortraitAlbum(long ownerId);

	/**
	 * 复制普通相册信息到头像相册，设为头像功能会使用此方法
	 * 
	 * @param portraitAlbum
	 *            头像相册
	 * @param photo
	 *            被复制的照片
	 * */
	public void copyPhotoToPortraitAlbum(Album portraitAlbum, Photo photo);

	/**
	 * 上传图片到头像相册
	 * 
	 * @param owner
	 *            相册拥有者
	 * @param portraitAlbum
	 *            头像相册
	 * @param result
	 *            图片压缩结果信息
	 * 
	 * @return 创建后的照片
	 * */
	public Photo createPortraitPhoto(User owner, Album portraitAlbum, ImageResizeResult result);

	/**
	 * 获取当前头像的大图，即头像相册最后一张图片
	 * 
	 * @param userId
	 *            用户Id
	 * @return 当前头像所属的照片
	 * */
	public Photo getUserCurrentPortraitPhoto(long userId);

	/**
	 * 通过头像相册获取当前头像的大图，即头像相册最后一张图片
	 * 
	 * @param portraitAlbum
	 *            头像相册
	 * @return 当前头像所属的照片
	 * */
	public Photo getCurrentPortraitPhotoFromAlbum(Album portraitAlbum);

	/** -------------------华丽的分割线，下面的还没实现呢-------------------------------- **/
	// public Photo getPhotoForChangePhoto(long photoId, long userId);
	// public Photo getPhotoById(int photoId);
	//
	// public void changePhotoDescribe(int userId, int photoId, String
	// describe);

	// /**
	// * 获取用户相册详细信息
	// *
	// * @param albumId
	// * 相册Id
	// * @return 相册信息
	// */
	// public Album getAlbumDetailById(long albumId);

	// /**
	// * 照片列表
	// *
	// * @param albumId
	// * 相册Id
	// * @param viewerId
	// * 浏览者Id
	// * @return 照片列表（不含照片描述）
	// */
	// public List<Photo> listPhotosOfAlbumForChange(long albumId, long userId);

	// /**
	// * 浏览用户相册列表（分页，不带头像相册），浏览者和被浏览者不能同时为0，如果被浏览者Id=0，就认为是看自己的相册列表。
	// *
	// * @param ownerId
	// * 拥有者Id
	// * @param viewerId
	// * 浏览者Id
	// * @param authority
	// * 浏览者相对于拥有者的权限
	// * @param page
	// * 分页用
	// * @return 相册列表（不含相册地点、描述）
	// */
	// public List<Album> listAlbumsOfUserWithoutPortrait(long ownerId, long
	// viewerId, int authority, Page page);

}
